#define _CRT_SECURE_NO_WARNINGS 1

//#include<string>
//#include<iostream>
//
//using namespace std;
//
//string reverseStr(string s, int k)
//{
//    int count = 2 * k, left = 0, right = 0;
//    int size = s.size();
//    while (count <= size)
//    {
//        left = count - 2 * k;
//        right = left + k - 1;
//        while (left < right && left < size && right < size)
//        {
//            swap(s[left++], s[right--]);
//        }
//        count += 2 * k;
//    }
//
//    return s;
//}
//int main()
//{
//    string s("abcdefg");
//
//    cout << reverseStr(s, 2) << endl;
//
//    return 0;
//}

//#include<string>
//#include<iostream>
//
//using namespace std;
//
//string reverseWords(string s)
//{
//    int size = s.size();
//    int left = 0, right = 0;
//    for (int i = 0; i < size;)
//    {
//        for (int j = i; j < size; j++)
//        {
//            if (s[j] == ' ')
//            {
//                left = i;
//                right = j - 1;
//                while (left < right && left < size && right < size)
//                {
//                    swap(s[left++], s[right--]);
//                }
//                i = j + 1;
//                break;
//            }
//            else if (j == size - 1)
//            {
//                left = i;
//                right = j;
//                while (left < right && left < size && right < size)
//                {
//                    swap(s[left++], s[right--]);
//                }
//                return s;
//            }
//        }
//    }
//    return s;
//}
//
//int main()
//{
//    string s("Let's take LeetCode contest");
//
//    cout << reverseWords(s) << endl;
//    
//    return 0;
//}

#include<algorithm>
#include<string>
#include<iostream>

using namespace std;

string addStrings(string s1, string s2)
{
    int end1 = s1.size() - 1, end2 = s2.size() - 1;
    int next = 0;
    string RetString;
    while (end1 >= 0 || end2 >= 0)
    {
        int x1 = end1 >= 0 ? s1[end1] - '0' : 0;
        int x2 = end2 >= 0 ? s2[end2] - '0' : 0;
        int ret = x1 + x2 + next;
        next = ret / 10;
        ret = ret % 10;
        RetString += ret + '0';
        end1--;
        end2--;
    }
    if (next == 1)
    {
        RetString += '1';
    }
    reverse(RetString.begin(), RetString.end());
    return RetString;
}

string multiply(string num1, string num2) 
{
    if (num1 == "0" || num2 == "0") 
    {
        return "0";
    }
    string ans = "0";
    int m = num1.size(), n = num2.size();
    for (int i = n - 1; i >= 0; i--) 
    {
        string curr;
        int add = 0;
        for (int j = n - 1; j > i; j--) 
        {
            curr.push_back(0);
        }
        int y = num2.at(i) - '0';
        for (int j = m - 1; j >= 0; j--) 
        {
            int x = num1.at(j) - '0';
            int product = x * y + add;
            curr.push_back(product % 10);
            add = product / 10;
        }
        while (add != 0) 
        {
            curr.push_back(add % 10);
            add /= 10;
        }
        reverse(curr.begin(), curr.end());
        for (auto& c : curr) 
        {
            c += '0';
        }
        ans = addStrings(ans, curr);
    }
    return ans;
}

int main()
{
    string s1("123");
    string s2("456");

    cout << multiply(s1, s2) << endl;

    return 0;
}